package com.example.zluserservice.framework.config;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

/**
 * @Author zhenliu（孙凌岳）
 * @Description AI-Redis 配置类 配置自定义的 RedisTemplate，解决默认序列化导致的乱码问题，并对 Java 8 日期时间类型做 JSON 格式化处理。
 * @Date 2025/6/15 11:42
 * @Version 1.0
 */
@Configuration
@EnableCaching
public class RedisConfiguration {

    /**
     * 自定义的 Jackson ObjectMapper，配置了 Java8 日期时间模块，
     * 并且格式化 LocalDate、LocalDateTime 为指定字符串格式。
     */
    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();

//    // 默认日期格式
//    private static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
//
//    // 默认日期时间格式
//    private static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
//
//    static {
//        // 注册 Java 8 时间模块，支持 LocalDate、LocalDateTime 序列化和反序列化
//        JavaTimeModule timeModule = new JavaTimeModule();
//
//        // 反序列化时，指定字符串转 LocalDate 的格式
//        timeModule.addDeserializer(LocalDate.class,
//                new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)));
//
//        // 反序列化时，指定字符串转 LocalDateTime 的格式
//        timeModule.addDeserializer(LocalDateTime.class,
//                new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)));
//
//        // 序列化时，指定 LocalDate 转字符串的格式
//        timeModule.addSerializer(LocalDate.class,
//                new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)));
//
//        // 序列化时，指定 LocalDateTime 转字符串的格式
//        timeModule.addSerializer(LocalDateTime.class,
//                new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)));
//
//        // 禁用序列化为时间戳，改为序列化为可读的字符串格式
//        OBJECT_MAPPER.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
//
//        // 注册时间模块到 ObjectMapper
//        OBJECT_MAPPER.registerModule(timeModule);
//    }

    /**
     * 自定义 RedisTemplate Bean，覆盖 Spring Boot 默认配置
     * @param redisConnnectionFactory Redis 连接工厂
     * @return 配置好序列化器的 RedisTemplate 实例
     */
    @Bean("redisTemplate")
    @Primary // 标记为首选 RedisTemplate，当注入时默认使用此配置
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnnectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();

        // 关联 Redis 连接工厂
        redisTemplate.setConnectionFactory(redisConnnectionFactory);

        // 设置 Key 的序列化器为字符串，保证 Redis 客户端能看到可读的 Key
        redisTemplate.setKeySerializer(new StringRedisSerializer());

        // 设置 Value 的序列化器为 JSON，使用定制的 ObjectMapper
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer(OBJECT_MAPPER));

        // 设置 Hash Key 序列化器为字符串
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());

        // 设置 Hash Value 序列化器为 JSON
        redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer(OBJECT_MAPPER));

        return redisTemplate;
    }
}
